package cn.iocoder.yudao.module.ym.service.ticket;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

import cn.iocoder.yudao.module.ym.controller.admin.site.vo.SitePageReqVO;
import jakarta.validation.*;
import cn.iocoder.yudao.module.ym.controller.admin.ticket.vo.*;
import cn.iocoder.yudao.module.ym.dal.dataobject.ticket.TicketDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.apache.ibatis.annotations.Param;

/**
 * 工单 Service 接口
 *
 * @author 韩艳阳
 */
public interface TicketService {


    Map<String,Object> statistics(TicketPageReqVO pageReqVO);
    /**
     * 创建工单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createTicket(@Valid TicketSaveReqVO createReqVO);

    /**
     * 更新工单
     *
     * @param updateReqVO 更新信息
     */
    void updateTicket(@Valid TicketSaveReqVO updateReqVO);

    /**
     * 更新工单 不插入日志
     *
     * @param updateReqVO 更新信息
     */
    void editTicket(@Valid TicketSaveReqVO updateReqVO);

    /**
     * 重新派发
     *
     * @param updateReqVO 更新信息
     */
    void redistribute(@Valid TicketSaveReqVO updateReqVO);

    /**
     * 拒单
     *
     * @param updateReqVO 更新信息
     */
    void refuse(@Valid TicketSaveReqVO updateReqVO);

    /**
     * 接单
     *
     * @param updateReqVO 更新信息
     */
    void takeOrders(@Valid TicketSaveReqVO updateReqVO);

    /**
     * 完单
     *
     * @param updateReqVO 更新信息
     */
    void overOrders(@Valid TicketSaveReqVO updateReqVO);

    /**
     * 闭单
     *
     * @param updateReqVO 更新信息
     */
    void closeOrders(@Valid TicketSaveReqVO updateReqVO);

    /**
     * 删除工单
     *
     * @param id 编号
     */
    void deleteTicket(Long id);

    /**
     * 获得工单
     *
     * @param id 编号
     * @return 工单
     */
    TicketRespVO getTicket(Long id);

    /**
     * 获得我发起的工单不分页
     *
     * @param pageReqVO 分页查询
     * @return 工单分页
     */
    List<TicketRespVO> getMyCreateLise(TicketPageReqVO pageReqVO);

    /**
     * 获得我发起的工单分页
     *
     * @param pageReqVO 分页查询
     * @return 工单分页
     */
    PageResult<TicketRespVO> getMyCreatePage(TicketPageReqVO pageReqVO);


    /**
     * 获得我的工单不分页
     *
     * @param pageReqVO 分页查询
     * @return 工单分页
     */
    List<TicketRespVO> getMyList(TicketPageReqVO pageReqVO);

    /**
     * 获得我的工单分页
     *
     * @param pageReqVO 分页查询
     * @return 工单分页
     */
    PageResult<TicketRespVO> getMyPage(TicketPageReqVO pageReqVO);

    /**
     * 获得工单分页
     *
     * @param pageReqVO 分页查询
     * @return 工单分页
     */
    PageResult<TicketRespVO> getTicketPage(TicketPageReqVO pageReqVO);

    /**
     * 获得工单不分页
     *
     * @param pageReqVO 分页查询
     * @return 工单分页
     */
    List<TicketRespVO> getTicketList(TicketPageReqVO pageReqVO);

//   Integer pendingTicket(SitePageReqVO pageReqVO);

    Map<Object,Object> growthGate(SitePageReqVO pageReqVO1);

    Map<Integer,List<TicketDO>> dateGrouping(TicketPageReqVO pageReqVO);

    Map<Integer,List<TicketDO>> dateGrouping(Long id);

    Map<Integer,Integer> ticketMetrics(TicketPageReqVO pageReqVO);

    List<Map<Long, Object>> allCount();

    List<Map<Long, Object>> todayCount();

    //分页
    PageResult<Map<String, Object>> getDailyTicketCountByOperator(Long operatorId,  Integer pageNo, Integer pageSize);

    //不分页
    List<Map<String, Object>> getDailyTicketCountByOperator(Long operatorId);

    long countByUserIdAndStatus(Long userId,Integer type);

    long todayCountByUserId(Long userId);

    TicketTypeRespVO ticketTypeCount(@Param("sTime") LocalDate sTime,@Param("operatorId") Long operatorId);
}
